package cn.test.future.cf;

import java.util.concurrent.CompletableFuture;
import java.util.function.BiFunction;
import java.util.function.Supplier;

/**
 * 对于烧水泡茶这个程序，一种最优的分工方案：
 * 用两个线程 T1 和 T2 来完成烧水泡茶程序，
 * T1 负责洗水壶、烧开水、泡茶这三道工序，
 * T2 负责洗茶壶、洗茶杯、拿茶叶三道工序，
 * 其中 T1 在执行泡茶这道工序时需要等待 T2 完成拿茶叶的工序。
 */
// CompletableFuture实现
public class Tea2 {

    public static void main(String[] args) {
        CompletableFuture<Void> future1 = CompletableFuture.runAsync(new Runnable() {
            @Override
            public void run() {
                System.out.println("T1：洗水壶");
                System.out.println("T1：烧开水");
            }
        });

        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(new Supplier<String>() {
            @Override
            public String get() {
                System.out.println("T2：洗茶壶");
                System.out.println("T2：洗茶杯");
                System.out.println("T2：拿茶叶");
                return "龙井";
            }
        });

        CompletableFuture<String> result = future1.thenCombine(future2, new BiFunction<Void, String, String>() {
            @Override
            public String apply(Void unused, String s) {
                System.out.println("T1：拿到茶叶");
                System.out.println("T1：泡茶 " + s);
                return "上茶";
            }
        });

        System.out.println(result.join());
    }
}
